#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <dirent.h>
#include <assert.h>
#include <errno.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/dir.h>
#include <sys/stat.h>

#include "bstrlib.h"
#include "server.h"
#include "common.h"
#include "receive.h"
#include "send_file_listing.h"
#include "send_metadata.h"
#include "send_slice.h"
#include "fd_list.h"

void send_file_listing(fd_list list, int j){
    int count = 0,i = 0, fd_client = 0;
    struct dirent **files;
    char *msg = NULL;

    fd_client = fd_list_get_fd(list, j);

    msg = calloc(128, sizeof(char));
    if (msg == NULL){
        perror("calloc-msg");
        send_msg(fd_client, MSG199);
        close(fd_client);
        fd_list_remove(list, j);
        return;
    }

    /*Pedimos el listado de los archivos dentro de FOLDER*/
    count = scandir(FOLDER, &files, 0, alphasort);
    if (count < 0){
        perror("scandir");
        send_msg(fd_client, MSG199);
        free(msg);
        msg = NULL;
        close(fd_client);
        fd_list_remove(list, j);
        return;
    }
    else{
        /*OK al cliente*/
        send_msg(fd_client, MSG0);
        /*Comenzamos el for en 2 para evitar listar los directorios . y .. */
        for (i = 2; i < count; i++){
            msg = (char*)realloc(msg,sizeof(char)*(strlen(files[i]->d_name)+4));
            /*Copiamos el nombre del archivo y se lo enviamos al cliente*/
            strcpy(msg, files[i]->d_name);
            strncat(msg,"\r\n", 2);
            send_msg(fd_client, msg);
            free(files[i]);
        }
        /*Liberamos todo*/
        free(files[0]);
        free(files[1]);
        free(files);
        files = NULL;

        send_msg(fd_client,"\r\n");
        fd_list_set_finish(list, j, true);

    }
    free(msg);
    msg = NULL;
    return;
}
